import { getToken, setToken, removeToken, setTimeStamp } from '../../utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'
const state = {
  token: getToken(), // 用户token 权限
  userInfo: {}// 用户的信息 用对象的形式
}
const mutations = {
  setToken(state, token) {
    state.token = token
    setToken(token)
  },
  removeToken(state) {
    state.token = null
    removeToken()
  },
  setUserInfo(state, result) {
    // 这里要注意想让vuex响应就要改变 userInfo的值 对象改变值中直接赋值是对的
    state.userInfo = result
  },
  removeUserInfo(state) {
    // 这里清空值不能赋值null这样我们想要获取里面的属性但是还是空对象时会报错 可以来个空对象
    state.userInfo = {}
  }
}
const actions = {
  async login(context, data) {
    const result = await login(data)
    context.commit('setToken', result)
    // 这里表示可以登陆成功了注入时间戳
    setTimeStamp()
  },
  async getUserInfo(context) {
    // 请求用户数据
    const result = await getUserInfo()
    // 请求用户其他资料
    const baseInfo = await getUserDetailById(result.userId)
    // 将个人信息保存到vuex中
    context.commit('setUserInfo', { ...result, ...baseInfo })
    return result // 这里为什么要返回 为后面埋下伏笔
  },
  logout(context) {
    // 登出
    context.commit('removeToken')
    context.commit('removeUserInfo')
    // 清楚路由 这个是管路径的 即退出后输入路径无法跳转
    // 设置路由为初始状态 这个是管左侧导航的
    resetRouter()
    // 在没有枷锁的情况下可以随意调用另一个子模块的mutation action
    // 但是加了锁即都有命名空间 就要用 第三个参数{root:true} 表示调用根级的子模块
    // 第一个参数调用的时候要给清楚是哪个子模块下的 加路径
    context.commit('permission/setRoutes', [], { root: true })
    // 退出时清楚标签记录
    context.dispatch('tagsView/delAllViews', null, { root: true })
  }
}
export default {
  // 为啥要设置namespaced
  // 默认情况下，模块内部的 action、mutation 和 getter 是注册在全局命名空间的——这样使得多个模块能够对同一 mutation 或 action 作出响应。
  // 相当于可以成为了带命名空间的模块
  namespaced: true,
  state,
  mutations,
  actions
}
